package code;

import java.util.ArrayList;

public class Biblio {
	Trie<Character, Long> porNombre;
	Trie<Long, String> porISBN;

	// pasar astring
	public Biblio(Character[] alfabeto1, Long[] alfabeto2) {
		porNombre = new Trie<Character, Long>(alfabeto1);
		porISBN = new Trie<Long, String>(alfabeto2);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Biblio other = (Biblio) obj;
		
		if (porISBN == null) {
			if (other.porISBN != null)
				return false;
		} else if (!porISBN.equals(other.porISBN))
			return false;
		
		if (porNombre == null) {
			if (other.porNombre != null)
				return false;
		} else if (!porNombre.equals(other.porNombre))
			return false;
		
		return true;
	}
	

	public void agregarPorNombre(String nombre, Long ISBN) {

		try {
			porNombre.agregar(new Tupla<Character[], Long>(stringToChar(nombre), ISBN));
			porISBN.agregar(new Tupla<Long[], String>(toLongArray(ISBN), nombre));
		} catch (Exception e) {
			System.out.println("No ha podido ser agregado. Causa: " + e.getMessage());
		}
	}

	public void agregarISBN(Long ISBN, String nombre) {
		try {
			porISBN.agregar(new Tupla<Long[], String>(toLongArray(ISBN), nombre));
			porNombre.agregar(new Tupla<Character[], Long>(stringToChar(nombre), ISBN));
		} catch (Exception e) {
			System.out.println("No ha podido ser agregado. Causa: " + e.getMessage());
		}
	}

	public ArrayList<Tupla<String, Long>> buscarPorNombre(String nombre) {
		ArrayList<Tupla<Character[], Long>> respuesta = null;
		try {
			respuesta = porNombre.buscar(stringToChar(nombre)); // ArrayList<Tupla<Chacaracter [],Integer >>
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

		ArrayList<Tupla<String, Long>> respuesta2 = new ArrayList<Tupla<String, Long>>();

		String aux = "";
		for (int i = 0; i < respuesta.size(); i++) {
			aux = charToString(respuesta.get(i).getE1());
			// genero las Tuplas <Tupla<String,Integer >>
			respuesta2.add(new Tupla<String, Long>(aux, respuesta.get(i).getE2()));
		}

		return respuesta2;
	}
	
	public ArrayList<Tupla<Long, String>> buscarPorISBN(Long isbnBusqueda) {
		ArrayList<Tupla<Long[], String>> resul = null;
		try {
			resul = porISBN.buscar(toLongArray(isbnBusqueda)); // ArrayList<Tupla<Chacaracter [],Integer >>
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
		ArrayList<Tupla<Long, String>> respuesta2 = new ArrayList<Tupla<Long, String>>();

		Long aux = null;
		for (int i = 0; i < resul.size(); i++) {
			aux = arrayToLong(resul.get(i).getE1());
			// genero las Tuplas <Tupla<String,Integer >>
			respuesta2.add(new Tupla<Long, String>(aux, resul.get(i).getE2()));
		}

		return respuesta2;
	}
	
	@Override
	public String toString() {
		StringBuffer str = new StringBuffer();
		str.append(porNombre.toString());
		str.append(System.lineSeparator());
		str.append(System.lineSeparator());
		str.append(porISBN.toString());
		return str.toString();
	}
	
	
	//metodos auxiliares
	
	private String charToString(Character[] valor) {
		String ret = "";

		for (int i = 0; i < valor.length; i++) {
			ret = ret + valor[i];
		}

		return ret;
	}

	private Character[] stringToChar(String valor) {
		char[] aux = valor.toCharArray();
		Character[] clave = new Character[aux.length];

		for (int i = 0; i < aux.length; i++) {
			clave[i] = aux[i];
		}

		return clave;

	}

	private Long arrayToLong(Long[] in){
		StringBuffer str = new StringBuffer();
		
		for (int i = 0; i < in.length; i++) {
			str.append(in[i].toString());
		}
		
		return Long.valueOf(str.toString());
	}
	
	private Long[] toLongArray(Long in){
		String aux = in.toString();
		Long[] resul = new Long[aux.length()];
		for (int i = 0; i < aux.length(); i++) {
			resul[i] = (long) Character.getNumericValue(aux.charAt(i));
		}
		return resul;
	}
	
}
